Thrift RPC的一个简单c++ demo

您所在的位置:网站首页 vector project Thrift RPC的一个简单c++ demo

Thrift RPC的一个简单c++ demo

#Thrift RPC的一个简单c++ demo| 来源: 网络整理| 查看: 265

Thrift是一种开源的跨语言的RPC服务框架,最初由facebook公司开发的,在2007年facebook将其提交apache基金会开源了。对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性。

 

Thrift代码包(位于thrift-0.6.1/lib/cpp/src)有以下几个目录:

concurrency:并发和时钟管理方面的库

processor:Processor相关类

protocal:Protocal相关类

transport:transport相关类

server:server相关类

Transport类(how is transmitted?)

负责数据传输,有以下几个可用类:

TFileTransport:文件(日志)传输类,允许client将文件传给server,允许server将收到的数据写到文件中。

THttpTransport:采用Http传输协议进行数据传输

TSocket:采用TCP Socket进行数据传输

TZlibTransport:压缩后对数据进行传输,或者将收到的数据解压

下面几个类主要是对上面几个类地装饰(采用了装饰模式),以提高传输效率。

TBufferedTransport:对某个Transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或者将数据直接写入buffer

TFramedTransport:同TBufferedTransport类似,也会对相关数据进行buffer,同时,它支持定长数据发送和接收。

TMemoryBuffer:从一个缓冲区中读写数据

Protocol类(what is transmitted?)

负责数据编码,主要有以下几个可用类:

TBinaryProtocol:二进制编码

TJSONProtocol:JSON编码

TCompactProtocol:密集二进制编码

TDebugProtocol:以用户易读的方式组织数据

Server类(providing service for clients)

TSimpleServer:简单的单线程服务器,主要用于测试

TThreadPoolServer:使用标准阻塞式IO的多线程服务器

TNonblockingServer:使用非阻塞式IO的多线程服务器,TFramedTransport必须使用该类型的server

 

首先需要定义.thrift接口文件:

namespace cpp project struct CompanyInfo{ 1: i32 id; 2: string name; 3: string desc; 4: string country; } namespace cpp project include "define.thrift" service CompanyServlet { bool Sender(1: list companies); oneway void Sender2(1: list companies); }

然后使用thrift --gen cpp rpc.thrift生成代码,生成的代码里有一个服务端框架文件(CompanyServlet_server.skeleton.cpp),可以以此来构建server。

编写server端代码

// This autogenerated skeleton file illustrates how to build a server. // You should copy it to another filename to avoid overwriting it. #include "./gen-cpp/CompanyServlet.h" #include #include #include #include #include #include #include #include using namespace ::apache::thrift; using namespace ::apache::thrift::protocol; using namespace ::apache::thrift::transport; using namespace ::apache::thrift::server; using boost::shared_ptr; using namespace ::project; class CompanyServletHandler : virtual public CompanyServletIf { public: CompanyServletHandler() { // Your initialization goes here } bool Sender(const std::vector< ::project::CompanyInfo> & companies) { // Your implementation goes here printf("Sender\n"); for(const ::project::CompanyInfo &info : companies){ printf("id[%d], name[%s], desc[%s], country[%s]\n", info.id, info.name.c_str(), info.desc.c_str(), info.country.c_str()); } return true; } void Sender2(const std::vector< ::project::CompanyInfo> & companies) { // Your implementation goes here printf("Sender2\n"); } }; int main(int argc, char **argv) { int port = 9090; shared_ptr handler(new CompanyServletHandler()); shared_ptr processor(new CompanyServletProcessor(handler)); shared_ptr serverTransport(new TServerSocket(port)); shared_ptr transportFactory(new TBufferedTransportFactory()); shared_ptr protocolFactory(new TBinaryProtocolFactory()); TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory); server.serve(); return 0; }

这里只实现了简单的打印。

编写client代码

#include "./gen-cpp/CompanyServlet.h" #include #include #include #include #include using namespace ::apache::thrift; using namespace ::apache::thrift::protocol; using namespace ::apache::thrift::transport; using boost::shared_ptr; using namespace ::project; int main(int argc, char *argv[]) { int port = 9090; shared_ptr tsocket(new TSocket("localhost", port)); shared_ptr transport(new TBufferedTransport(tsocket)); shared_ptr protocol(new TBinaryProtocol(transport)); project::CompanyServletClient client(protocol); for(;;){ transport->open(); CompanyInfo info; info.id = 700; info.name = "Tencent"; info.desc = "Integrated Internet Service Provider"; info.country = "China"; std::vector v; v.push_back(info); if(!client.Sender(v)) printf("Sender failed!\n"); transport->close(); sleep(1); } return 0; }

 贴上编译命令吧

g++ -W -g -Wno-unused -std=c++11 -o thrift_test_server.run thrift_test_server.cpp  ./gen-cpp/define_types.o  ./gen-cpp/rpc_types.o  ./gen-cpp/define_constants.o  ./gen-cpp/rpc_constants.o  ./gen-cpp/CompanyServlet.o -lthrift



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3